package awk.designModel.singleton;

import java.util.concurrent.atomic.AtomicReference;

/**
 * 使用CAS锁来实现单例模式:
 * （CAS锁（Compare and Swap）：比较并交换，是一种有名的无锁算法，属于乐观锁）。用CAS锁来实现单例模式是线程安全的
 * @author cui_yonghua  https://blog.csdn.net/cui_yonghua/article/details/90512943
 */
public class CasClassG {
	//1.私有化构造方法，使得在类的外部不能调用此方法，限制产生多个对象
	private CasClassG(){ }
	//2.在类的内部创建一个类的实例
	private static final AtomicReference<CasClassG> instance = new AtomicReference<CasClassG>();
	//3.对外部提供调用方法：将创建的对象返回，只能通过类来调用
	public static final CasClassG getInstance(){
		for(;;){
			CasClassG current = instance.get();
			if(current != null){
				return current;
			}
			current = new CasClassG();
			if(instance.compareAndSet(null,current)){
				return current;
			}
		}
	}

	//测试
	public static void main(String[] args) {
		CasClassG a = CasClassG.getInstance();
		CasClassG b = CasClassG.getInstance();
		System.out.println(a==b);
	}
}
